package gestordeentidades.identitymap.interfaces;

import java.util.List;
import java.util.Map;
import gestordeentidades.persistance.DataBaseObject;
import java.util.Collection;
import java.util.function.Predicate;


/**
 * Trabalho DAS - 2014/2015
 * Objecto que tem a responsabilidade de assegurar que os objectos são 
 * lidos apenas quando necessário (uma única vez).
 * Mantém um mapa que permite pesquisar aos objectos que já se encontram em memória.
 * @author a21210380, a21190325, a21210392
 */
public interface IEntityMap {

    /**
     * Procura uma entidade pelo seu id
     * @param <T> extends DataBaseObject para se ter acesso ao id do objecto
     * @param entidade
     * @param id
     * @return
     */
    public <T extends DataBaseObject> T procurarEntidadePeloID(Class<T> entidade, int id);

    /**
     * Procurar todas as entidades
     * @param <T> extends DataBaseObject para se ter acesso ao id do objecto
     * @param entidade
     * @return
     */
    public <T extends DataBaseObject> Collection<T> procurarPorTodasAsEntidadesComoColecao(Class<T> entidade);

    /**
     * Procurar todas as entidades
     * @param <T> extends DataBaseObject para se ter acesso ao id do objecto
     * @param entidade
     * @return
     */
    public <T extends DataBaseObject> Map<Integer, T> procurarPorTodasAsEntidadesComoMapa(Class<T> entidade);

    /**
     * Procurar todas as entidades aplicando um filtro
     * @param <T> extends DataBaseObject para se ter acesso ao id do objecto
     * @param entidade
     * @param filtro
     * @return
     */
    public <T extends DataBaseObject> List<T> filtrarEntidades(Class<T> entidade, Predicate<T> filtro);
    
    /**
     * Insere uma entidade caso esta seja adicionada como nova
     * @param <T> extends DataBaseObject para se ter acesso ao id do objecto
     * @param entidade
     */
    public <T extends DataBaseObject> void registarNovaEntidade(T entidade);

    /**
     * Remove uma entidade caso seja necessário remove-la
     * @param <T> extends DataBaseObject para se ter acesso ao id do objecto
     * @param entidade
     */
    public <T extends DataBaseObject> void registarEntidadeApagada(T entidade);
}
